package com.imooc.netty;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * @author zx
 * @date 2024-10-04 15:43
 */
public class WebSocketInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        ChannelPipeline pipeline = channel.pipeline();
        //websocket 基于http协议,所以要由http编解码器
        pipeline.addLast(new HttpServerCodec());
        //对大数据流的支持
        pipeline.addLast(new ChunkedWriteHandler());
        //对httpMessage 进行聚合，聚合成FullHttpRequest 或 FullHttpResponse
        //几乎在netty中的编程，都会使用这个handler
        pipeline.addLast(new HttpObjectAggregator(1024*64));

        //================================以上是用于支持http协议================

        //webSocket服务器处理的协议，用于指定给客户端连接访问的路由 /WS
        // 本handler会帮助我们处理一些繁琐的工作,会帮我们处理握手动作: handshaking(close,ping,pong) ping+pong = 心跳
        //对于websocket来讲,都是一frames进行传输，不同的数据类型对于的frame也不同。
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        //自定义handler,客户端传递的消息进行处理，然后对客户端响应
        pipeline.addLast(new WebSocketCustomerHandler());
    }
}
